/**
 * @desc axios封装
 * @author xuzhiming
 * @date 2021/6/2
 */

import axios from 'axios'
import { Toast } from 'vant'
import store from '@/store'
import { getToken } from '@/utils/auth'

/**
 * 请求失败后的错误统一处理
 * @param {number} code 请求返回的状态码
 * @param {string} data 请求返回的数据
 */
const handleError = (code, data) => {
  switch (code) {
    case 200:
      Toast('请求成功')
      break
    case 201:
      Toast('对象创建成功')
      break
    case 202:
      Toast('请求已被接受')
      break
    case 204:
      Toast('操作已执行，未返回数据')
      break
    case 301:
      Toast('资源已被移除')
      break
    case 303:
      Toast('重定向')
      break
    case 304:
      Toast('资源没有被修改')
      break
    case 400:
      Toast('参数列表错误')
      break
    case 401:
      // 这里要清除一些全局的loading哦，例如 vant: Toast.clear()
      Toast('未授权')
      store.dispatch('user/LOGOUT').then(() => {
        location.reload()
      })
      // router.push('/Login')
      break
    case 403:
      Toast('访问受限，授权过期')
      break
    case 404:
      Toast('资源，服务未找到')
      break
    case 405:
      Toast('不允许的http方法')
      break
    case 409:
      Toast('资源冲突/被锁')
      break
    case 415:
      Toast('不支持的数据/媒体类型')
      break
    case 500:
      Toast('服务器错误')
      break
    case 501:
      Toast('接口未实现')
      break
    default:
      Toast(data.desc)
      break
  }
}

// 创建一个axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // 请求跨域时传cookie到服务端
  timeout: 5000 // 请求超时
})

// 拦截器
service.interceptors.request.use(
  config => {
    // 发送请求之前do something
    if (store.getters.token) {
      config.headers['X-Token'] = getToken()
    }
    return config
  },
  error => {
    // 请求报错do something
    console.log(error, 'err') // for debug
    return Promise.reject(error)
  }
)

/**
 * 响应格式
 * { code => 状态码, msg => '响应信息', data => 数据 }
 */
service.interceptors.response.use(
  response => {
    const res = response.data
    // 如果码状态码不是200，则判定为错误。
    if (res.code !== 200) {
      // 200: 操作成功; 201: 对象创建成功; 202: 请求已被接受; 204: 操作已执行，但是没有返回数据;
      // 301: 资源已被移除; 303: 重定向; 304: 资源没有被修改;
      //  400: 参数列表错误; 401: 未授权; 403: 访问受限，授权过期; 404: 资源，服务未找到; 405: 不允许的http方法; 409: 资源冲突/被锁; 415: 不支持的数据/媒体类型;
      // 500: 服务器错误; 501: 接口未实现;
      // 处理自定义错误
      handleError(res.code, res)
      return Promise.reject(new Error(res.message || '响应未知错误'))
    } else {
      return Promise.resolve(res)
    }
  },
  error => {
    console.log('response error:' + error) // for debug
    Toast.fail({
      message: error.message,
      duration: 1.5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service
